﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Data.SqlClient;
using AccesoBD;
namespace AccesoBD
{
    public class Pacientes
    {
        public static bool VerificarExistenciaDePaciente(long documento)
        {
            SqlConnection con = null;
            bool existencia = false;
    
        
            try
            {
                con = DB.Conectar();
      
                string comando = "select * from Persona where nroDocumento=@doc";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@doc", documento));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                if (dr.Read())
                {
               
                    existencia = true;
                }
            }
            catch (Exception Ex)
            {

                throw new Exception("Error al verificar paciente", Ex);
            }
            finally
            {

                con.Close();
            }

            return existencia;

        }

        public static long ObtenerUltimoIDHistoriaClinica()
        {
            SqlConnection con = DB.Conectar();
            long id = 0;
            SqlTransaction tran = null;
            try
            {

                tran = con.BeginTransaction();

                string comando = "select Max(nroHC) from Historia_Clinica";
                List<SqlParameter> listp = new List<SqlParameter>();
                string nroHc = DB.EjecutarScalar(comando, listp, con, tran);
                if (!nroHc.Equals(""))
                {//Tener en cuenta si retorna siempre null. Siempre retornaria cero
                    id = long.Parse(nroHc.ToString());

                }
                tran.Commit();

            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw new Exception("Error al obtener ultimo Id del Paciente", Ex);
            }
            finally
            {
                con.Close();

            }

            return id;
        }
        public static long ObtenerUltimoIDPersona(SqlTransaction tran, SqlConnection con)
        {
            long id = 0;

            try
            {



                string comando = "select Max(codPersona) from Persona";
                List<SqlParameter> listp = new List<SqlParameter>();
                id = long.Parse(DB.EjecutarScalar(comando, listp, con, tran));
                if (id > 0)
                {
                    return id;
                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener ultimo Id de la Persona", Ex);
            }

            return id;
        }


        public static int registrarPaciente(Paciente P, Domicilio oD, List<ObraSocialXPaciente> ListoSxP)
        {

            int resultado = 0;
            SqlConnection con = null;
            SqlTransaction tran = null;
            con = DB.Conectar();
            try
            {
                tran = con.BeginTransaction();

                //REGISTRAMOS PERSONA
                string comando = "insert into Persona (nombre,apellido,tipoDocumento,nroDocumento,telefono,celular,mail,sexo,fechaNacimiento) values(@nombre,@apellido,@tipoDocumento,@nroDocumento,@telefono,@celular,@mail,@sexo,@fechaNacimiento)  ";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@nombre", P.Nombre));
                listp.Add(new SqlParameter("@apellido", P.Apellido));
                listp.Add(new SqlParameter("@tipoDocumento", P.TipoDocumento));
                listp.Add(new SqlParameter("@nroDocumento", P.NroDocumento));
                listp.Add(new SqlParameter("@fechaNacimiento", P.FechaNacimiento));
                listp.Add(new SqlParameter("@sexo", P.Sexo));

                //PARAMETROS QUE PUEDEN RECIBIR NULL

                if (P.Telefono == null)
                {
                    listp.Add(new SqlParameter("@telefono", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@telefono", P.Telefono));
                }

                if (P.Celular == null)
                {
                    listp.Add(new SqlParameter("@celular", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@celular", P.Celular));
                }
                if (P.Mail == null)
                {
                    listp.Add(new SqlParameter("@mail", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@mail", P.Mail));
                }

                resultado = DB.EjecutarCommand(comando, listp, con, tran);

                if (resultado > 0)
                {
                    P.idPersona = ObtenerUltimoIDPersona(tran, con);
                    //REGISTRAMOS DOMICILIO
                    comando = "insert into Domicilio (calle, numero, idBarrio, piso, departamento,codigoPostal) values(@calle, @numero, @idBarrio,@piso,@departamento,@codigoPostal)";
                    listp = null;
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@calle", oD.calle));
                    listp.Add(new SqlParameter("@numero", oD.numero));
                    listp.Add(new SqlParameter("@idBarrio", oD.idBarrio));
                    if (oD.piso == null)
                    {
                        listp.Add(new SqlParameter("@Piso", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@Piso", oD.piso));
                    }
                    if (oD.Departamento == null)
                    {
                        listp.Add(new SqlParameter("@departamento", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@departamento", oD.Departamento));

                    }
                    if (oD.codPostal == null)
                    {
                        listp.Add(new SqlParameter("@codigoPostal", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@codigoPostal", oD.codPostal));

                    }
                    resultado = DB.EjecutarCommand(comando, listp, con, tran);

                    if (resultado > 0)
                    {
                        P.idDomicilio = Domicilios.ObtenerUltimoIDDomicilio(tran, con);
                        //REGISTRAMOS HISTORIAL DE INGRESO

                        comando = "insert into Historial_Ingreso (fechaAlta) values (@fechaAlta) ";
                        listp = null;
                        listp = new List<SqlParameter>();
                        listp.Add(new SqlParameter("@fechaAlta", DateTime.Now));
                        resultado = DB.EjecutarCommand(comando, listp, con, tran);

                        if (resultado > 0)
                        {
                            //REGISTRAMOS LA HISTORIA CLINICA
                            comando = "insert into Historia_Clinica (fechaCreacion) values (@fechaCreacion) ";
                            listp = null;
                            listp = new List<SqlParameter>();
                            listp.Add(new SqlParameter("@fechaCreacion", DateTime.Now));
                            resultado = DB.EjecutarCommand(comando, listp, con, tran);

                            if (resultado > 0)
                            {


                                //REGISTRAMOS PACIENTE
                                P.nroHistorialIngreso = HistorialesDeIngreso.ObtenerUltimoIdHistorialIngreso(con, tran);
                                P.nroHC = Hitoriales_Clinicos.ObtenerUltimaHistoriaClinica(con, tran);
                                comando = "insert into Paciente (nroHC,idPersona, idTipoPaciente, nroAfiliado, idHistorialIngreso, idEstadoPaciente,idDomicilio) values(@nroHC,@idPersona,@idTipoPaciente, @nroAfiliado, @idHistorialIngreso, @idEstadoPaciente,@idDomicilio) ";
                                listp = null;
                                listp = new List<SqlParameter>();
                                listp.Add(new SqlParameter("@nroHC", P.nroHC));
                                listp.Add(new SqlParameter("@idPersona", P.idPersona));
                                listp.Add(new SqlParameter("@idTipoPaciente", P.idTipoPaciente));
                                listp.Add(new SqlParameter("@idHistorialIngreso", P.nroHistorialIngreso));
                                listp.Add(new SqlParameter("@idEstadoPaciente", P.idEstadoPaciente));
                                listp.Add(new SqlParameter("@idDomicilio", P.idDomicilio));

                                if (P.nroAfiliado == null)
                                {
                                    listp.Add(new SqlParameter("@nroAfiliado", DBNull.Value));
                                }
                                else
                                {
                                    listp.Add(new SqlParameter("@nroAfiliado", P.nroAfiliado));

                                }
                                resultado = DB.EjecutarCommand(comando, listp, con, tran);
                                if (resultado > 0)
                                {
                                    if (ListoSxP != null)
                                    {
                                        comando = "insert into ObraSocialXPaciente(nroHCpaciente,idPersonaPaciente,idObraSocial,nroAfiliadoOS)values(@nroHCpaciente,@idPersonaPaciente,@idObraSocial,@nroAfiliadoOS)";
                                        foreach (ObraSocialXPaciente item in ListoSxP)
                                        {

                                            listp = new List<SqlParameter>();
                                            listp.Add(new SqlParameter("@nroHCpaciente", P.nroHC));
                                            listp.Add(new SqlParameter("@idPersonaPaciente", P.idPersona));
                                            listp.Add(new SqlParameter("@idObraSocial", item.idObraSocial));
                                            listp.Add(new SqlParameter("@nroAfiliadoOS", item.nroAfiliado));

                                            resultado = DB.EjecutarCommand(comando, listp, con, tran);

                                            listp = null;
                                        }
                                        if (resultado > 0)
                                        {
                                            tran.Commit();
                                        }
                                    }
                                    else
                                    {
                                        tran.Commit();
                                    }

                                }

                            }
                        }



                    }


                }




            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw new Exception("No se pudo registrar el Paciente", Ex);
            }

            finally
            {

                con.Close();
            }

            return resultado;

        }
    }
}
